zhouqijie

一、检测错误、检测状态、打印信息日志

编写检测错误的函数:

bool checkOpenGLError()
{
	bool foundError = false;
	int glErr = glGetError();
	while (glErr != GL_NO_ERROR)
	{
		cout << "glError:" << glErr << endl;
		foundError = true;
		glErr = glGetError();
	}
	return foundError;
}

循环调用glGetError()检查是否发生OpenGL错误,编译错误和链接错误都可以检测。

编写打印信息日志的函数:

void printProgramLog(int program)
{
	int len = 0;
	int chWritten = 0;
	char * log;
	glGetProgramiv(program, GL_INFO_LOG_LENGTH, &len);
	if (len > 0)
	{
		log = (char *)malloc(len);
		glGetProgramInfoLog(program, len, &chWritten, log);
		cout << "ProgramInfoLog:" << log << endl;
		free(log);
	}
}
void printShaderLog(GLuint shader)
{
	int len = 0;
	int chWritten = 0;
	char * log;
	glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &len);
	if (len > 0)
	{
		log = (char *)malloc(len);
		glGetShaderInfoLog(shader, len, &chWritten, log);
		cout << "Shader info Log:" << log << endl;
		free(log);
	}
}

函数glGetShaderiv()glGetProgramiv()用于返回着色器/程序的参数。例如编译状态、删除状态、信息日志长度、源码长度等。
函数glGetShaderInfoLog()glGetProgramInfoLog() 用于获取着色器/程序的信息日志。

检测编译和链接错误:

//glCompileShader(vShader);  //以下是检测编译错误的语句。
checkOpenGLError();
glGetShaderiv(vShader, GL_COMPILE_STATUS, &isVertCompiled);
if (isVertCompiled != 1)
{
	cout << "Vertex Compile Failed!" << endl;
	printShaderLog(vShader);
}
//glLinkProgram(vfProgram);  //以下是检测链接错误的语句。
checkOpenGLError();
glGetProgramiv(vfProgram, GL_LINK_STATUS, &isLinked);
if (isLinked != 1)
{
	cout << "Link Failed" << endl;
	printProgramLog(vfProgram);
}

①先检测错误。
②再检测状态。
③如果状态是失败,则打印信息日志。

补充:

1、相关函数可以放在Utility.h/cpp文件中而不是main.cpp中。

2、可以使用glGet()类指令获取OpenGL某些方面的数值限制。例如用glGetFloatv(GL_POINT_SIZE_RANGE, size)查询点尺寸的范围。



二、从文件读取GLSL源代码。

读取函数可以放在Utility.h/cpp文件中。

读取函数:

string readShaderSource(const char * path)
{
	string content;
	ifstream fileStream(path, ios::in);
	string line = "";
	while (!fileStream.eof())
	{
		getline(fileStream, line);
		content.append(line + "\n");
	}
	fileStream.close();
	return content;
}

string转换成const char*类型:

string strVertShader = readShaderSource("MyVertShader.glsl");
string strFragShader = readShaderSource("MyFragShader.glsl");

const char * vshaderSource = strVertShader.c_str();
const char * fshaderSource = strFragShader.c_str();
//注意:不能直接用readShaderSource().c_str()